//JS编程风格  Crockford编写的代码规范  "编程风格"（programming style）

// --------1>变量声明
// js会自动将变量声明 提升 到 代码块 （block）的头部
if(!o) {
	var o = {};
};
//等同于
var o;
if(!o){
	o = {};
}
//为了避免出现问题，不如把 变量声明都放在代码块的头部
//例如
for(var i ...) {...}
//最好写成：
var i;
for(i...){...}
//规则@1》因此，把有变量声明都放在函数的头部。所有函数都在使用之前定义

//---------2》全局变量
//JS最大的语法缺点，可能就是全局变量对于任何一个代码块，都是可读可写，这对代码的模块化和重复使用，非常不利。
//规则@2》避免使用全局变量；如果不得不使用，用大写字母表示变量名，比如UPPER_CASE。

//---------3> new命令 js使用new命令，从建构函数生成一个新对象
function myObject (argument) {
	// body...
}
var o = new myObject();
var o =  myObject();
//规则@3》问题是，若你忘记加new ，myObject()内部的this关键字就会指向全局对象，导致所有绑定在this上面的变量，都变成全局变量。
//不要使用new命令，改用Object.create()命令。
//若不的不使用new命令，为了防止出错，最好在视觉上把构建函数与其他函数区分开来。
//构建函数的函数名，采用首字母大写，其他函数名，一律首字母小写

//------------4>自增和自减运算符
//自增++和自减--运算符，放在变量的前面和后面，返回的值不一样，很容易发生错误。
//事实上，所有的++运算符都可以用“+=1”代替。
++x//等同于
x += 1;
++x;
++x;
//等同于
x +=2;
//规则@4，不要使用自增++和自减--运算符号，用+=和-=代替。

//--------------5>区块
//若循环和判断的代码体只有一行，JS允许该区块（block）省略大括号。
if (a) b(); c();
//原意可能是
if (a) {b(); c();}
//但是，实际效果是
if (a) { b();} c();

//规则@5 总是使用大括号表示区块。

//--------------6>大括号的位置
function a(){ 
	return 
	{ 
		a :　5
	}
};
a();
//undefined
function a(){ 
	return { //大括号不要另起一行
		a :　5
	};
};
a();
//Object {a: 5}
//规则@6表示区块的大括号，不要另起一行

//--------------6>圆括号
//两作用，一是表示调用函数，一是表示 不同的值的组合; 可以用空格区分这两种不同 的 括号
//规则@6 调用函数的时候，函数名与左括号之间没有空格; 函数名与参数序列之间没有空格; 所有其他语法元素与左括号之间，都有一个空格;

//按照上面的规格，下面的写法是不规范的：
foo (bar)
return(a+b);
if(a === 0) {...}
function foo (b) {...}
function(x) {...}

//--------------7>分号
//分号表于语句的结束，大多数情况下，若你省略了句尾的分号，js会自动添加;
var a = 1
//等同于 
var a = 1;

//因此，有人提倡省略句尾的分号。
//但是，如果下一行的第一个字元（token）是下面这五个字符之一，
//Javascript将不对上一行句尾添加分号："("、 "["、 "/"、 "+" 和 "-"。

x = y 
(function (){ ... })();
//等同于
x=y()function (){ ... })();

//规则@7 不要省略句末的分号;


//--------------8>with语句  with语句，可以减少代码的书写，但是会造成混淆;

with(o){
	a = b;
}
//上面的代码可以有 四种运行结果
o.a = b;
o.a = o.b;
a = b;
a = o.b;
//这四种结果都可能发生，取决于不同的变量是否有定义。因此，
//规则@8 不要使用with语句。

//--------------9>相等和严格相等

//js有两个“相等”的运算符，“相等” （==） 和 “严格相等” （===）

//因为"相等"运算符会自动转换 变量类型，造成很多意想不到的情况：

　　0 == ''// true
　　1 == true // true
　　2 == true // false
　　0 == '0' // true
　　false == 'false' // false
　　false == '0' // true
　　" \t\r\n " == 0 // true

//规则@9：不要使用"相等"（==）运算符，只使用"严格相等"（===）运算符。

//--------------10>语句的合并 有些程序员追求简洁，喜欢合并不同目的的语句，

a = b;
if(a) { ... }
//他喜欢写成这样
if( a = b ) { ... }
// 虽然语句少了一行，但是可读性大打折扣，而且会造成误读，让别人误以为这行代码的意思是：

if ( a === b ) {...}

//另外一种情况是，有些程序员喜欢在同一行中赋值多个变量：
var a = b = 0;
//他以为，这行代码等同于
　　var a = 0, b = 0;
//实际上不是，它的真正效果是下面这样：
　　b = 0;

　　var a = b;
//因此，规则@10：不要将不同目的的语句，合并成一行。